โปรแกรมบ นท ก ช อ และ อ เมล โดยจ ดเก บข อม ลลงไปท SQLite
Application => Single View Application => Next Product Name = ContactLite, Devices = iphone, Use Storyboards, Use Automatic Reference Counting
เล อกไปท TARGETS => Build Pharses => + เล อก libsqlite3.dylib เล อก Add
เป ดไฟล Contact.h #import <Foundation/Foundation.h> @interface Contact : NSObject NSString *pkid; NSString *name; NSString *email; @property(strong, nonatomic)nsstring *name; @property(strong, nonatomic)nsstring *email; @property(strong, nonatomic)nsstring *pkid; @end เป ดไฟล Contact.m #import "Contact.h" @implementation Contact @synthesize pkid,name,email; @end
วาง Navigation Bar, Table View, Table View Cell และ Bar Button Item ตาม ล าด บลงบนร ปด านล างน
คล กไปท Navigation Bar แล วเปล ยนค าของ Title = Contact
คล กไปท ป มตามร ปด านล าง Item แล วไปท ไอคอน Attribute เปล ยนค า Identifier = Add
เล อกไปคล กท Table View Cell ตามร ปด านล างน แล วไปเปล ยนค าของ Style = Subtitle, Identifier = Cell
เป ดไฟล ViewController.h ข นมา #import <UIKit/UIKit.h> #import "sqlite3.h" #import "Contact.h" @interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> NSArray *datalist; @property (weak, nonatomic) IBOutlet UINavigationItem *navitem; @property (weak, nonatomic) IBOutlet UITableView *tablev; @property (nonatomic, retain) NSArray *datalist; @property (strong, nonatomic) NSString *databasepath; @property (nonatomic) sqlite3 *contactdb; -(void)setupdatabase; -(void)loaddatabase; -(void)deletecontact:(nsstring *)pkid; @end
เป ดไฟล ViewController.m ข นมา #import "ViewController.h" #import "SaveViewController.h" @interface ViewController () @end @implementation ViewController @synthesize datalist, tablev; @synthesize databasepath, contactdb; @synthesize navitem; -(void)setupdatabase // Get the documents directory NSArray *dirpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docsdir = dirpaths[0]; // Build the path to the database file databasepath = [[NSString alloc] initwithstring: [docsdir stringbyappendingpathcomponent: @"contacts.db"]]; NSFileManager *filemgr = [NSFileManager defaultmanager]; if ([filemgr fileexistsatpath: databasepath] == NO) const char *dbpath = [databasepath UTF8String]; if (sqlite3_open(dbpath, &contactdb) == SQLITE_OK) char *errmsg; const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, EMAIL TEXT)"; if (sqlite3_exec(contactdb, sql_stmt, NULL, NULL, &errmsg)!= SQLITE_OK) NSLog(@"Failed to create table");
เป ดไฟล ViewController.m - (ต อ) -(void)loaddatabase NSMutableArray *data = [NSMutableArray array]; sqlite3_stmt *statement; NSString *querysql = @"SELECT id, name, email FROM contacts"; const char *query_stmt = [querysql UTF8String]; const char *dbpath = [databasepath UTF8String]; if (sqlite3_open(dbpath, &contactdb) == SQLITE_OK) sqlite3_prepare_v2(contactdb, query_stmt, -1, &statement, NULL); while (sqlite3_step(statement) == SQLITE_ROW) NSString *Id = [[NSString alloc]initwithutf8string:(const char *) sqlite3_column_text(statement, 0)]; NSString *name = [[NSString alloc]initwithutf8string:(const char *) sqlite3_column_text(statement, 1)]; NSString *email = [[NSString alloc]initwithutf8string:(const char *) sqlite3_column_text(statement, 2)]; Contact *row = [[Contact alloc] init]; row.pkid = Id; row.name = name; row.email = email; [data addobject:row]; datalist = [NSMutableArray arraywitharray:data]; sqlite3_finalize(statement);
เป ดไฟล ViewController.m - (ต อ) - (void)viewdidload [super viewdidload]; navitem.leftbarbuttonitem = self.editbuttonitem; [self setupdatabase]; [self loaddatabase]; -(void)viewdidappear:(bool)animated [super viewdidappear:yes]; [self setupdatabase]; [self loaddatabase]; [tablev reloaddata]; - (void)didreceivememorywarning [super didreceivememorywarning]; // Dispose of any resources that can be recreated. -(NSInteger)tableView:(UITableView *)tableview numberofrowsinsection:(nsinteger)section return datalist.count;
เป ดไฟล ViewController.m - (ต อ) -(UITableViewCell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath static NSString *cellid = @"Cell"; UITableViewCell *cell = [tableview dequeuereusablecellwithidentifier:cellid]; if (cell == nil) cell = [[UITableViewCell alloc] initwithstyle:uitableviewcellstylesubtitle reuseidentifier:cellid]; Contact *row = (Contact *)[datalist objectatindex:indexpath.row]; cell.textlabel.text = [NSString stringwithformat:@"%@-%@", row.pkid, row.name]; cell.detailtextlabel.text = row.email; return cell;
เป ดไฟล ViewController.m - (ต อ) -(void)tableview:(uitableview *)tableview commiteditingstyle: (UITableViewCellEditingStyle)editingStyle forrowatindexpath:(nsindexpath *)indexpath if (editingstyle == UITableViewCellEditingStyleDelete) Contact *row = [datalist objectatindex:indexpath.row]; NSMutableArray *array = [NSMutableArray arraywitharray:datalist]; [array removeobject:row]; datalist = array; [self deletecontact:row.pkid]; [tableview deleterowsatindexpaths:[nsarray arraywithobject:indexpath] withrowanimation:uitableviewrowanimationautomatic]; -(void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender SaveViewController *vc = (SaveViewController *)segue.destinationviewcontroller; vc.databasepath = self.databasepath; vc.contactdb = self.contactdb; -(void)setediting:(bool)editing animated:(bool)animated [super setediting:editing animated:animated]; [tablev setediting:editing animated:animated];
เป ดไฟล ViewController.m - (ต อ) -(UITableViewCellEditingStyle)tableView:(UITableView *)tableview editingstyleforrowatindexpath:(nsindexpath *)indexpath if (tablev.editing) return UITableViewCellEditingStyleDelete; return UITableViewCellEditingStyleNone; -(void)deletecontact:(nsstring *)pkid sqlite3_stmt *statement; const char *dbpath = [databasepath UTF8String]; if (sqlite3_open(dbpath, &contactdb) == SQLITE_OK) NSString *SQL = @"DELETE FROM CONTACTS WHERE ID= \"%@\""; NSString *deletesql = [NSString stringwithformat:sql, pkid]; const char *delete_stmt = [deletesql UTF8String]; sqlite3_prepare_v2(contactdb, delete_stmt,-1, &statement, NULL); if (sqlite3_step(statement)!= SQLITE_DONE) NSLog(@"DELETE FAILED"); sqlite3_finalize(statement); sqlite3_close(contactdb); @end
ต งค า Class = SaveViewController และ Subclass of = UIViewController เป ดไฟล SaveViewController.h #import <UIKit/UIKit.h> #import "sqlite3.h" @interface SaveViewController : UIViewController<UITextFieldDelegate> - (IBAction)doSaveClick:(id)sender; @property (weak, nonatomic) IBOutlet UITextField *tfname; @property (weak, nonatomic) IBOutlet UITextField *tfemail; @property (strong, nonatomic) NSString *databasepath; @property (nonatomic) sqlite3 *contactdb; @end
เป ดไฟล SaveViewController.m #import "SaveViewController.h" @interface SaveViewController () @end @implementation SaveViewController @synthesize tfname, tfemail; @synthesize databasepath, contactdb; -(BOOL)textFieldShouldReturn:(UITextField *)textfield [textfield resignfirstresponder]; return YES; - (id)initwithnibname:(nsstring *)nibnameornil bundle: (NSBundle *)nibbundleornil self = [super initwithnibname:nibnameornil bundle:nibbundleornil]; if (self) // Custom initialization return self; - (void)viewdidload [super viewdidload];! // Do any additional setup after loading the view. [tfname becomefirstresponder]; - (void)didreceivememorywarning [super didreceivememorywarning]; // Dispose of any resources that can be recreated.
- (IBAction)doSaveClick:(id)sender sqlite3_stmt *statement; const char *dbpath = [databasepath UTF8String]; if (sqlite3_open(dbpath, &contactdb) == SQLITE_OK) NSString *SQL = @"INSERT INTO CONTACTS (name, email) VALUES (\"%@\",\"%@\")"; NSString *insertsql = [NSString stringwithformat:sql, tfname.text, tfemail.text]; const char *insert_stmt = [insertsql UTF8String]; sqlite3_prepare_v2(contactdb, insert_stmt,-1, &statement, NULL); if (sqlite3_step(statement) == SQLITE_DONE) [self dismissviewcontrolleranimated:yes completion:nil]; else NSLog(@"SAVE FAILED"); sqlite3_finalize(statement); sqlite3_close(contactdb); @end
ท าการเช อมโยงหน าจอด งร ปด านล างเข าไปเช อมก บ navitem ท าการเช อมโยงหน าจอด งร ปด านล างเข าไปเช อมก บ tablev
ท าการคล กขวาท Table View แล วท าการเช อม datasource และ delegate ไปย งไอคอนส เหล องด านล างด งภาพ
วาง View Controller ด งร ปไปบน MainStoryboard.Storyboard
คล กขวาท ไอคอนส เหล องด งร ปด านล าง แล วท าการเช อ modal ไป ย งไอคอน +
คล กขวาท ไอคอนส เหล องด งร ปด านล าง แล วไปเล อกไอคอนท 3 ตามร ปแล วท าการเปล ยน Class = SaveViewController
วาง Label 2 อ นต งค า Text = NAME, EMAIL ตามร ป วาง Text Field 2 อ น และ ป มต งค า Text = SAVE